<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    var num = 10;
    var boo = false;
    var str = "sss";
    var arr = [1, 2, 3];
    var obj = { a: 1 };
    var fun = function () {};
    function fn() {}
    var undef;
    var n = null;
    var sy = Symbol("111");
    var bint = BigInt(121212);
    /**
    常见的基本数据类型：Number String   Boolean
      七种基本数据类型：Number(整数或者浮点数) String   Boolean   Null   undefined   BigInt(任意精度的整数)  Symbol
    */

    //1、使用 typeof 判断这些数据的类型
    /*
    typeof  num  的值是字符串
    ===>> Number String   Boolean   undefined 的数据类型可以准确的输出
    ===>> 对象，数组，null 的数据类型输出的结果是   "object"
    ===>> 函数(声明式函数，函数表达式) 的数据类型输出的结果是   "function"
    */
    console.log(typeof num); // number
    console.log(typeof boo); // boolean
    console.log(typeof str); // string
    console.log(typeof arr); // object  错误
    console.log(typeof obj); // object
    console.log(typeof fun); // function
    console.log(typeof fn); // function
    console.log(typeof undef); // undefined
    console.log(typeof n); // object   错误
    console.log(typeof sy); // symbol
    console.log(typeof bint); // bigint

    //2、instanceof
    //注意: undefined  null 类型得数据不能使用instanceof 来判断
    //用法：(值 instanceof 数据类型) 值得 Boolean类型
    /*
    ===>> instanceof 判断是不准确的 
    */

    // console.log(num instanceof Number);// false
    // console.log(boo instanceof Boolean);// false
    // console.log(str instanceof String); // false
    // console.log(arr instanceof Array);  // 数组是不是 数组 true
    // console.log(arr instanceof Object); // 数组是不是 对象 true ====> instanceof 判断不准确
    // console.log(arr instanceof Function);// 数组是不是 函数 false
    // console.log(obj instanceof Object); // 对象 是不是 对象 true
    // console.log(obj instanceof Array);  // 对象 是不是 数组 false
    // console.log(fun instanceof Function); // 函数 是不是 函数 true
    // console.log(fun instanceof Object);   // 函数 是不是 对象 true ====>> instanceof 判断不准确
    // console.log(fn instanceof Function);// true

    //3、constructor 构造器
    //使用方法：num.constructor
    /*
    ====>> 不做处理的情况下  constructor 还是可以准确的判断数据的类型的
    ====>> 但是 数据的constructor 是可以改变的
    */
    // console.log(num.constructor);// f Number () {}
    // console.log(num.constructor === Number);// true
    // console.log(boo.constructor);// f Boolean () {}
    // console.log(str.constructor === String);// true
    // console.log(arr.constructor === Array); // true
    // console.log(arr.constructor === Object);// false
    // console.log(obj.constructor === Object);// true
    // console.log(fun.constructor === Function);// true
    // console.log(fn.constructor === Function);// true

    function Foo() {}
    //===>> 改变 Foo 函数的constructor
    // Foo.prototype = new Array();//改变函数的原型
    // var f = new Foo();
    // console.log(f.constructor === Function);// false
    // console.log(f.constructor === Array);   // true

    // 4、Object.prototype.toString  和  call();
    // 用法: Object.prototype.toString.call(num);  结果是  [object Number]  (字符串)
    // var s = Object.prototype.toString;

    // console.log(s.call(num) === "[object Number]");// [object Number]
    // console.log(s.call(boo));// [object Boolean]
    // console.log(s.call(str));// [object String]
    // console.log(s.call(arr));// [object Array]
    // console.log(s.call(obj));// [object Object]
    // console.log(s.call(fun));// [object Function]
    // console.log(s.call(undef));// [object Undefined]
    // console.log(s.call(n));  // [object Null]
  </script>
</html>
